package com.yh.config;

import lombok.Data;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.integration.mqtt.core.DefaultMqttPahoClientFactory;
import org.springframework.stereotype.Component;

/**
 * 用于管理 MQTT 配置属性及连接相关的 Bean 定义。通过 Spring 的注解从配置文件中读取相关属性，
 * 并提供连接选项和 MQTT 客户端工厂的初始化方法，确保与 MQTT Broker 的通信设置符合需求。
 */
@Data
@Component
public class MqttProperties {

    /**
     * MQTT Broker 的 URI 地址，例如 tcp://localhost:1883
     */
    @Value("${mqtt.broker.uri}")
    private String uri;

    /**
     * MQTT 客户端的唯一标识 ID，用于标识连接
     */
    @Value("${mqtt.client.id}")
    private String clientId;

    /**
     * MQTT 消息订阅或发布的默认 Topic
     */
    @Value("${mqtt.topic}")
    private String topic;

    /**
     * 配置 MQTT 连接选项
     * <p>
     * 创建并返回一个 `MqttConnectOptions` 实例，用于定义 MQTT 客户端的连接属性。
     * 包括以下功能：
     * 1. 设置 Broker 地址。
     * 2. 设置持久会话选项（false 表示建立持久会话）。
     * 3. 启用自动重连功能。
     *
     * @return 配置完成的 MqttConnectOptions 实例
     */
    @Bean
    public MqttConnectOptions mqttConnectOptions() {
        MqttConnectOptions options = new MqttConnectOptions();
        options.setServerURIs(new String[]{uri});
        // 接受离线消息，告诉代理客户端是否要建立持久会话   false为建立持久会话
        options.setCleanSession(false);
        // 设置断开后重新连接
        options.setAutomaticReconnect(true);
        return options;
    }

    /**
     * 创建 MQTT 客户端工厂
     * <p>
     * 使用提供的 `MqttConnectOptions` 配置初始化 `DefaultMqttPahoClientFactory`，
     * 用于创建和管理 MQTT 客户端实例。
     *
     * @param mqttConnectOptions MQTT 连接选项
     * @return 配置完成的 DefaultMqttPahoClientFactory 实例
     */
    @Bean
    public DefaultMqttPahoClientFactory mqttClientFactory(MqttConnectOptions mqttConnectOptions) {
        DefaultMqttPahoClientFactory factory = new DefaultMqttPahoClientFactory();
        factory.setConnectionOptions(mqttConnectOptions);
        return factory;
    }
}
